package com.guanji.learn.util;

import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import org.apache.poi.poifs.crypt.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.util.List;

public final class PasswordXlsxUtil {

    /**
     * 把普通 List<Bean> 导出成带打开密码的 .xlsx（内存完成）
     *
     * @param data     数据列表
     * @param password 打开密码（≥1 位）
     * @return 加密后的 .xlsx 字节流
     */
    public static byte[] exportPasswordXlsx(List<?> data, String password) throws Exception {
        /* 1. Hutool 生成普通 .xlsx 到内存 */
        ByteArrayOutputStream plainBaos = new ByteArrayOutputStream();
        ExcelWriter writer = ExcelUtil.getWriter(true);   // true = 2007 格式
        writer.write(data, true);
        writer.flush(plainBaos, true);
        writer.close();

        /* 2. POI 加密（agile 模式才支持 .xlsx） */
        POIFSFileSystem fs = new POIFSFileSystem();
        EncryptionInfo info = new EncryptionInfo(
                EncryptionMode.agile,
                CipherAlgorithm.aes256,
                HashAlgorithm.sha512,
                -1, -1, ChainingMode.cbc);

        Encryptor enc = info.getEncryptor();
        enc.confirmPassword(password);

        try (OutputStream encOs = enc.getDataStream(fs)) {
            encOs.write(plainBaos.toByteArray());
        }

        /* 3. 加密文件系统写入内存 */
        ByteArrayOutputStream cipherBaos = new ByteArrayOutputStream();
        fs.writeFilesystem(cipherBaos);
        fs.close();

        return cipherBaos.toByteArray();
    }

    private PasswordXlsxUtil() {}
}